home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / PowerTalk Access Modules / Sample PMSAM / PMSAM Framework / Common / CAttribute.cp < prev    next >
Encoding:
Text File  |  1995-07-28  |  10.1 KB  |  476 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        CAttribute.cp
  3.  
  4.     Contains:    xxx put contents here xxx
  5.  
  6.     Written by:    Tim Harnett
  7.  
  8.     Copyright:    © 1994 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <7>      3/6/95    TMH        adapt to use Symantic compiler
  13.          <6>     2/27/95    TMH        adapt to use ETO16 universal headers
  14.          <5>     2/21/95    TMH        metrowerks changes, add explict cast
  15.          <4>     2/14/95    CL        remove segment
  16.          <3>     2/14/95    CL        remove globls
  17.          <2>    12/12/94    TMH        eliminate compiler warning
  18.          <1>     9/20/94    TMH        Abandon RoadsideRest embrace Mercury
  19.                   4/5/94    TMH        xxx put comment here xxx
  20.  
  21.     To Do:
  22. */
  23.  
  24.  
  25. #ifndef __OCEAUTHDIR__
  26. #include "OCEAuthDir.h"
  27. #endif
  28.  
  29. #ifndef __OCEErrors__
  30. #include "OCEErrors.h"
  31. #endif
  32.  
  33. #ifndef __BaseTypes__
  34. #include "BaseTypes.h"
  35. #endif
  36.  
  37.  
  38. #ifndef _Globals__
  39. #include "Globals.h"
  40. #endif
  41.  
  42.  
  43. #ifndef __CAttribute__
  44. #include "CAttribute.h"
  45. #endif
  46.  
  47. #ifndef __CRecordID__
  48. #include "CRecordID.h"
  49. #endif
  50.  
  51.  
  52.  
  53.  
  54. //----------------------------------------------------------------------------------------
  55. //                                C A t t r i b u t e
  56. //----------------------------------------------------------------------------------------
  57.  
  58. CAttribute::CAttribute(AttributeTypePtr attrType, AttributeTag tag, CreationID *cid)
  59. {
  60.     fAttributeType =  (const RString*)attrType;    // copy
  61.     fTag = tag;
  62.     if (cid) {
  63.         fCID.source = cid->source;
  64.         fCID.seq = cid->seq;
  65.     } else
  66.         fCID.source = fCID.seq = 0;
  67.  
  68.     fDataLength = 0;
  69.     fBytes = 0;
  70.  
  71.     fValueCallBack = 0;
  72. }
  73.  
  74.  
  75. //------------------------------------------------------------------------------------------
  76. CAttribute::CAttribute(short attrTypeIndex, AttributeTag tag, CreationID *cid)
  77. {
  78.  
  79.     fAttributeType = (RString*)OCEGetIndAttributeType(attrTypeIndex);    // copy
  80.     fTag = tag;
  81.     if (cid)
  82.         OCECopyCreationID(cid, &fCID); 
  83.     else
  84.         fCID.source = fCID.seq = 0;
  85.  
  86.     fDataLength = 0;
  87.     fBytes = 0;
  88.  
  89.     fValueCallBack = 0;
  90.  
  91. }
  92.  
  93.  
  94. //------------------------------------------------------------------------------------------
  95. CAttribute::~CAttribute()
  96. {
  97.     if( fBytes != 0 ) {
  98.         DisposePtr((Ptr)fBytes);
  99.         fBytes= 0;
  100.     }
  101.  
  102. }
  103.  
  104. //------------------------------------------------------------------------------------------
  105. #pragma segment Templates
  106. OSErr CAttribute::Write1Value(CRecordID& rid,void* valueBuf, long valueBufSize, AuthIdentity identity)
  107. {
  108.  
  109.     DirAddAttributeValuePB    pb;
  110.     
  111.     pb.dsRefNum = rid.GetDSRefNum();
  112.     pb.identity = identity;
  113.     
  114.     NilAddrBlock(&pb.serverHint);
  115.  
  116.     pb.aRecord = rid;
  117.     
  118.     fBytes = valueBuf;
  119.     fDataLength = valueBufSize;
  120.     pb.attr = (Attribute*)this;
  121.  
  122.     OSErr osErr = DirAddAttributeValue((DirParamBlockPtr)&pb, false);
  123.  
  124.     fBytes = 0;        // so destructor does not Dispose
  125.     return osErr;
  126.     
  127. }
  128.  
  129.  
  130. //------------------------------------------------------------------------------------------
  131. #pragma segment Templates
  132. OSErr CAttribute::AddAttribute(CRecordID& rid,AddrBlock *serverHint, AuthIdentity identity)
  133. {
  134.  
  135.     DirAddAttributeValuePB    pb;
  136.     
  137.     pb.dsRefNum = rid.GetDSRefNum();;
  138.     pb.identity = identity;
  139.     
  140.     NilAddrBlock(&pb.serverHint);
  141.  
  142.     pb.aRecord = rid;
  143.     
  144.     pb.attr = (Attribute*)this;
  145.  
  146.     OSErr osErr = DirAddAttributeValue((DirParamBlockPtr)&pb, false);
  147.  
  148.     return osErr;
  149.     
  150. }
  151.  
  152.  
  153.  
  154.  
  155.  
  156. //------------------------------------------------------------------------------------------
  157. #pragma segment Templates
  158. OSErr CAttribute::ChangeValue(CRecordID& rid,AddrBlock *serverHint, AuthIdentity identity)
  159. {
  160.     DirChangeAttributeValuePB    pb;
  161.  
  162.     pb.dsRefNum = rid.GetDSRefNum();
  163.     pb.identity = identity;
  164.     
  165.     NilAddrBlock(&pb.serverHint);
  166.  
  167.     pb.aRecord = rid;
  168.  
  169.     pb.currentAttr = (Attribute*)this;
  170.     
  171.     pb.newAttr = (Attribute*)this;
  172.     
  173.     
  174.     OSErr osErr =  DirChangeAttributeValue((DirParamBlockPtr)&pb, false);
  175.  
  176.     return osErr;
  177.     
  178. }
  179.  
  180.  
  181.  
  182.  
  183. //------------------------------------------------------------------------------------------
  184. #pragma segment Templates
  185. OSErr CAttribute::DeleteValue(CRecordID& rid,AddrBlock *serverHint, AuthIdentity identity)
  186. {
  187.     DirDeleteAttributeValuePB    pb;
  188.  
  189.     pb.dsRefNum = rid.GetDSRefNum();;
  190.     pb.identity = identity;
  191.         
  192.     NilAddrBlock(&pb.serverHint);
  193.  
  194.     pb.aRecord = rid;
  195.  
  196.     
  197.     pb.attr = (Attribute*)this;
  198.     
  199.     
  200.     OSErr osErr =  DirDeleteAttributeValue((DirParamBlockPtr)&pb, false);
  201.  
  202.     return osErr;
  203.     
  204. }
  205.  
  206.  
  207. //------------------------------------------------------------------------------------------
  208. #pragma segment Templates
  209. OSErr CAttribute::VerifyValueCID(CRecordID& rid,AddrBlock *serverHint, AuthIdentity identity)
  210. {
  211.     //    Assumes the fBytes as a value.
  212.  
  213.     DirVerifyAttributeValuePB    pb;
  214.  
  215.     pb.dsRefNum = rid.GetDSRefNum();;
  216.     pb.identity = identity;
  217.     
  218.     NilAddrBlock(&pb.serverHint);
  219.  
  220.     pb.aRecord = rid;
  221.  
  222.     
  223.     fCID.source = 0;
  224.     fCID.seq = 0;
  225.     
  226.     
  227.     pb.attr = (Attribute*)this;
  228.     
  229.     
  230.     OSErr osErr = DirVerifyAttributeValue((DirParamBlockPtr)&pb, false);
  231.  
  232.     return osErr;
  233.     
  234. }
  235.  
  236.  
  237. //------------------------------------------------------------------------------------------
  238. #pragma segment Templates
  239. static pascal Boolean    __EachRecordCallBack(long /*clientData*/, const RecordID* /*localRID*/ )
  240. {
  241.     return false;
  242. }
  243.  
  244. //------------------------------------------------------------------------------------------
  245. #pragma segment Templates
  246. static pascal Boolean    __EachAttributeCallBack(long  /*clientData*/,  const AttributeType* /*attrType*/, AccessMask /*myAttrAccMask*/)
  247. {
  248.     return false;
  249. }
  250.  
  251. //------------------------------------------------------------------------------------------
  252. #pragma segment Templates
  253. static pascal Boolean    __EachAttributeValueCallBack(long clientData, const Attribute* attrValue)
  254. {
  255.     CAttribute* attr = (CAttribute*)clientData;
  256.     
  257.     attr->fBytes = attrValue->value.bytes;
  258.     attr->fDataLength = attrValue->value.dataLength;
  259.     attr->fCID.source = attrValue->cid.source;
  260.     attr->fCID.seq = attrValue->cid.seq;
  261.     attr->fTag = attrValue->value.tag;
  262.     return false;        // we want only one value. (even if there are more)
  263.     
  264. }
  265.  
  266.  
  267.  
  268.  
  269. //------------------------------------------------------------------------------------------
  270. #pragma segment Templates
  271. OSErr CAttribute::Read1Value(CRecordID& rid, void* valueBuf, long* valueBufSize, AuthIdentity idendtity)
  272. {
  273.  
  274.  
  275.     DirLookupGetPB pb;
  276.     memset(&pb,0,sizeof(DirLookupGetPB));
  277.         
  278.     pb.ioResult        = 0;
  279.     pb.ioCompletion = 0;
  280.     
  281.     pb.dsRefNum = rid.GetDSRefNum();
  282.     pb.identity = idendtity;
  283.     
  284.     
  285.     NilAddrBlock(&pb.serverHint);
  286.  
  287.  
  288.     //    1.    Assume ONE record id.
  289.     
  290.     RecordIDPtr aRIDPtr = rid;
  291.     pb.aRecordList = &aRIDPtr;
  292.     pb.recordIDCount = 1;
  293.         
  294.  
  295.     //    2.    Assumes ONE attribute type
  296.         
  297.     AttributeType*    attrTypePtr = (AttributeType*)this->fAttributeType;
  298.  
  299.     pb.attrTypeList = &attrTypePtr;
  300.     pb.attrTypeCount = 1;
  301.  
  302.  
  303.     //    3.    Allocate the buffer for toolbox
  304.     
  305.     
  306.     Ptr dataBuf = NewPtr(*valueBufSize+kToolBoxAttrOverHead);
  307.     OSErr osErr = MemError();
  308.     if( osErr != 0 )
  309.         return osErr;
  310.         
  311.     pb.getBuffer = dataBuf;
  312.     pb.getBufferSize = *valueBufSize+kToolBoxAttrOverHead;
  313.         
  314.     
  315.     //    4.    Other Parameters
  316.     
  317.     
  318.     pb.clientData = (long) this;
  319.     
  320.             
  321.     if( fCID.source != 0 && fCID.seq != 0 ) {
  322.         pb.includeStartingPoint = true;        // when we want a value with particular cid
  323.         (CAttribute&)pb.startingAttribute = *this;    // copy
  324.     } else {
  325.         pb.includeStartingPoint = false;
  326.     }
  327.     
  328.     
  329.     pb.startingRecordIndex = 1;
  330.     pb.startingAttrTypeIndex = 1;
  331.  
  332.     osErr = DirLookupGet((DirParamBlock*)&pb, false);
  333.         
  334.     if( osErr == 0 ) {
  335.         DirLookupParsePB* parsePB = (DirLookupParsePB*)&pb;
  336.         parsePB->eachRecordID = __EachRecordCallBack;
  337.         parsePB->eachAttrType = __EachAttributeCallBack;
  338.         parsePB->eachAttrValue = __EachAttributeValueCallBack;
  339.         
  340.         osErr = DirLookupParse((DirParamBlock*)&pb, false);
  341.         
  342.     }
  343.     
  344.     
  345.     //    5.    Copy results from toolbox buffer to client buffer.
  346.     
  347.     
  348.     if( osErr == 0 && fDataLength != 0 && fDataLength <= *valueBufSize ) {
  349.         *valueBufSize = fDataLength;
  350.         BlockMove(fBytes,valueBuf,fDataLength);
  351.         fBytes = 0;        // so the destructor does not dispose
  352.     } else {
  353.         *valueBufSize = 0;
  354.     }
  355.     
  356.     if (fDataLength == 0 && osErr == noErr)
  357.         osErr = kOCENoSuchAttributeValue;
  358.  
  359.     DisposePtr(dataBuf);
  360.     return osErr;
  361.  
  362. }
  363.  
  364.  
  365.  
  366.  
  367. //------------------------------------------------------------------------------------
  368. #pragma segment CAttribute                
  369. OSErr CAttribute::LookupValues(CRecordID* rid,CAttributeValueCallBack callBack,long clientData)
  370. {
  371.     DirParamBlock pb;
  372.     memset(&pb,0,sizeof(DirParamBlock));
  373.  
  374.  
  375.     fValueCallBack = callBack;
  376.     fClientData = clientData;
  377.     fCallBackError = 0;
  378.  
  379.  
  380.         //    1. Header
  381.         
  382.     pb.lookupGetPB.dsRefNum = rid->GetDSRefNum();
  383.     pb.lookupGetPB.identity = gIdentity;
  384.     
  385.         //    2.    Assume ONE record id.
  386.  
  387.  
  388.     RecordIDPtr aRIDPtr = *rid;
  389.     pb.lookupGetPB.aRecordList = &aRIDPtr;
  390.     pb.lookupGetPB.recordIDCount = 1;
  391.     pb.lookupGetPB.startingRecordIndex = 1;
  392.  
  393.  
  394.         //    3.    Assume ONE attribute type
  395.         
  396.     AttributeType*    attrTypePtr = (AttributeType*)this->fAttributeType;
  397.     pb.lookupGetPB.attrTypeList = &attrTypePtr;
  398.     pb.lookupGetPB.attrTypeCount = 1;
  399.     pb.lookupGetPB.startingAttrTypeIndex = 1;
  400.  
  401.  
  402.         //    4.    Other
  403.     pb.header.clientData = (long)this;
  404.     pb.lookupGetPB.includeStartingPoint = false;
  405.  
  406.  
  407.  
  408.         //     5.    Buffer        
  409.     Ptr getBuff = NewPtr(kDefaultBuffSize);//•••
  410.     if( getBuff == 0 )
  411.         return MemError();
  412.         
  413.     pb.lookupGetPB.getBuffer = getBuff;
  414.     pb.lookupGetPB.getBufferSize = kDefaultBuffSize;
  415.     
  416.         
  417.         //    6.    Call backs
  418.     pb.lookupParsePB.eachRecordID = 0;
  419.     pb.lookupParsePB.eachAttrType = 0;
  420.     pb.lookupParsePB.eachAttrValue = __LookupValueCallBack;
  421.  
  422.     
  423.     OSErr osErr = noErr;
  424.     Boolean moreData = false;
  425.     do {
  426.     
  427.         osErr = DirLookupGet(&pb,false);
  428.         if (osErr==kOCEMoreData)
  429.             moreData = true;
  430.         else
  431.             moreData = false;
  432.             
  433.         if (osErr==noErr || osErr==kOCEMoreData) {
  434.             osErr = DirLookupParse(&pb,false);
  435.             if (osErr!=noErr || fCallBackError != 0 )
  436.                 moreData = false;    // this could be kOCEMoreAttrValue (buffer not big enough)
  437.                                     // or kOCEMoreData (didn't have permission to read)
  438.         }
  439.     } while (moreData);
  440.  
  441.  
  442.     DisposPtr(getBuff);
  443.     
  444.     if( osErr == 0 && fCallBackError != 0 )
  445.         osErr = fCallBackError;
  446.         
  447.     return osErr;
  448. }
  449.  
  450.  
  451.  
  452. //------------------------------------------------------------------------------------
  453. pascal Boolean    CAttribute::__LookupValueCallBack(long clientData, const Attribute* attrValue)
  454. {    
  455.  
  456.         //    We have this bit of redirection so that the call back can return errors.
  457.         
  458.         
  459.     Boolean haltEnumeration = false;
  460.     OSErr osErr = 0;
  461.  
  462.     CAttribute* thisCAttribute = (CAttribute*) clientData;
  463.     if( thisCAttribute->fValueCallBack != 0 )
  464.         osErr = thisCAttribute->fValueCallBack(thisCAttribute->fClientData,attrValue);
  465.  
  466.  
  467.     if(osErr != 0 ) {
  468.         thisCAttribute->fCallBackError = osErr;
  469.         haltEnumeration = true;
  470.     }
  471.     
  472.     
  473.     return haltEnumeration;
  474. }
  475.  
  476.